package cn.wolfcode.wolf2w;

import cn.wolfcode.wolf2w.interceptor.CheckLoginInterceptor;
import cn.wolfcode.wolf2w.resolver.UserInfoArgumentResolver;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.data.convert.CustomConversions;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.convert.DbRefResolver;
import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

@SpringBootApplication
public class UserApp implements WebMvcConfigurer{

    @Autowired
    private CheckLoginInterceptor checkLoginInterceptor;


    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {

        resolvers.add(userInfoArgumentResolver());

    }

    @Bean

    public UserInfoArgumentResolver userInfoArgumentResolver(){

        return new UserInfoArgumentResolver();

    }

    //配置拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(checkLoginInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/users/sendVerifyCode")
                .excludePathPatterns("/users/regist")
                .excludePathPatterns("/users/login")
                .excludePathPatterns("/users/checkPhone");
    }

    //mongodb 去除_class属性
    @Bean

    public MappingMongoConverter mappingMongoConverter(MongoDbFactory factory, MongoMappingContext context, BeanFactory beanFactory) {

        DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory);

        MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context);

        try {   mappingConverter.setCustomConversions(beanFactory.getBean(CustomConversions.class));

        } catch (NoSuchBeanDefinitionException ignore) {

        }

        // Don't save _class to mongo

        mappingConverter.setTypeMapper(new DefaultMongoTypeMapper(null));

        return mappingConverter;

    }

    //跨域访问
    @Bean
    public WebMvcConfigurer corsConfigurer() {

        return new WebMvcConfigurer() {

            @Override
            //重写父类提供的跨域请求处理的接口
            public void addCorsMappings(CorsRegistry registry) {

                //添加映射路径

                registry.addMapping("/**")

                        //放行哪些原始域

                        .allowedOrigins("*")

                        //是否发送Cookie信息

                        .allowCredentials(true)

                        //放行哪些原始域(请求方式)

                        .allowedMethods("GET", "POST", "PUT", "DELETE","OPTIONS")

                        //放行哪些原始域(头部信息)

                        .allowedHeaders("*")

                        //暴露哪些头部信息（因为跨域访问默认不能获取全部头部信息）

                        .exposedHeaders("Header1", "Header2");

            }

        };

    }


    public static void main(String[] agrs){

        SpringApplication.run(UserApp.class, agrs);
    }
}
